﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    public partial class DiverseUdlån : Window
    {
        #region Fields

        private readonly Controller _controller;
        private readonly Diverse _diverseWindow;

        #endregion

        #region Properties

        public IDiverse Diverse { get; set; }
        public IUdlån SelectedUdlån { get; set; }
        public IBruger SelectedBruger { get; set; }

        #endregion

        #region Creation

        public DiverseUdlån(Controller controller, IDiverse iDiverse, Diverse diverseWindow)
        {
            InitializeComponent();
            DataContext = this;
            _controller = controller;
            _diverseWindow = diverseWindow;
            Diverse = iDiverse;

            OpdaterSide();
        }

        #endregion

        #region Methods

        private void UdlånEnhed()
        {
            if (SelectedBruger == null) return;

            IAfdeling afdeling = _controller.HentBrugersAfdeling(SelectedBruger);

            var formular = new Form();
            formular.Title = String.Format("Udlån {0}", Diverse.Navn);
            formular.BtnSubmit = "Udlån";

            formular.CreateDisabledTextBox("initialer", "Brugerens initialer:", SelectedBruger.Initialer);
            formular.CreateDisabledTextBox("navn", "Brugerens navn:", SelectedBruger.Navn);
            formular.CreateDisabledTextBox("afdeling", "Brugerens afdeling:", afdeling.Navn);
            formular.CreateDateBox("dato", "Udlånsdato:", DateTime.Now);
            formular.CreateIntegerBox("antal", "Antal enheder:", "1");

            var window = new FormWindow(formular);
            if (window.ShowDialog() == true)
            {
                string antal = (string)formular.Result["antal"];
                DateTime dato = (DateTime)formular.Result["dato"];
                if (antal.IsIntegerGreaterThanZero())
                {
                    bool udlånt = _controller.OpretUdlån(SelectedBruger, Diverse, int.Parse(antal), dato);

                    if (udlånt)
                    {
                        OpdaterBrugereListView();
                        OpdaterAlleUdlånListView();

                        // opdater hardware siden
                        _diverseWindow.OpdaterSide();
                    }
                    else
                    {
                        MessageBox.Show("Der er ikke nok ledige enheder", "Fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
            }
        }

        #endregion

        #region Events

        private void ListViewAlleUdlån_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SelectedUdlån = ListViewAlleUdlån.SelectedItem as IUdlån;

            bool result = (SelectedUdlån != null);

            BtnFjernUdlån.IsEnabled = result;
            BtnOpdaterUdlån.IsEnabled = result;

            OpdaterTooltips();
        }

        private void ListViewBrugere_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SelectedBruger = ListViewBrugere.SelectedItem as IBruger;

            bool result = (SelectedBruger != null);

            BtnUdlånEnhed.IsEnabled = result;

            OpdaterTooltips();
        }

        private void MenuItemSletUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedUdlån == null) return;

            var result = MessageBox.Show(String.Format("Er du sikker på du vil fjerne udlånet?"), "Sikker?", MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.No) return;

            _controller.FjernUdlån(SelectedUdlån);

            OpdaterAlleUdlånListView();
            OpdaterBrugereListView();
            _diverseWindow.OpdaterSide();
        }

        private void MenuItemOpdaterUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedUdlån == null) return;

            var bruger = _controller.HentBrugerMedUdlån(SelectedUdlån);
            var afdeling = _controller.HentBrugersAfdeling(bruger);

            var formular = new Form();
            formular.Title = String.Format("Udlån {0}", Diverse.Navn);
            formular.BtnSubmit = "Opdater udlån";

            formular.CreateDisabledTextBox("initialer", "Brugerens initialer:", bruger.Initialer);
            formular.CreateDisabledTextBox("navn", "Brugerens navn:", bruger.Navn);
            formular.CreateDisabledTextBox("afdeling", "Brugerens afdeling:", afdeling.Navn);
            formular.CreateDateBox("dato", "Udlånsdato:", SelectedUdlån.UdlånsDato);
            formular.CreateIntegerBox("antal", "Antal enheder:", SelectedUdlån.Antal.ToString());

            var window = new FormWindow(formular);
            if (window.ShowDialog() == true)
            {
                string antal = (string)formular.Result["antal"];
                DateTime dato = (DateTime)formular.Result["dato"];
                if (antal.IsIntegerGreaterThanZero())
                {
                    bool opdateret = _controller.OpdaterUdlån(SelectedUdlån, int.Parse(antal), dato);

                    if (opdateret)
                    {
                        OpdaterAlleUdlånListView();

                        // opdater hardware siden
                        _diverseWindow.OpdaterSide();
                    }
                    else
                    {
                        MessageBox.Show("Der er ikke nok ledige enheder", "Fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
            }
        }

        private void BtnUdlånEnhed_Click(object sender, RoutedEventArgs e)
        {
            UdlånEnhed();
        }

        private void ListViewBrugere_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            UdlånEnhed();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
                Close();
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterBrugereListView()
        {
            ListViewBrugere.ItemsSource = null;
            ListViewBrugere.ItemsSource = _controller.HentBrugereDerIkkeHarLåntEnhed(Diverse);
        }

        public void OpdaterAlleUdlånListView()
        {
            ListViewAlleUdlån.ItemsSource = null;
            ListViewAlleUdlån.ItemsSource = _controller.HentUdlånMedEnhed(Diverse);
        }

        public void OpdaterSide()
        {
            OpdaterAlleUdlånListView();
            OpdaterBrugereListView();
            Title = Diverse.Navn;
            LblAlleUdlånTitel.Content = String.Format("Følgende brugere har lånt {0}", Diverse.Navn);
            LblNytUdlånTitel.Content = String.Format("Udlån {0} til en ny bruger", Diverse.Navn);
            OpdaterTooltips();
        }

        private void OpdaterTooltips()
        {
            // opdater tooltip der viser hvor mange ledige enheder der er tilbage
            ListViewAlleUdlån.ToolTip = String.Format("{0} tilbage: {1}", Diverse.Navn, Diverse.ResterendeAntal);
            ListViewBrugere.ToolTip = String.Format("{0} tilbage: {1}", Diverse.Navn, Diverse.ResterendeAntal);
        }

        #endregion
    }
}
